﻿2026-05-13T13:00:40.2204741Z ##[group]Run pnpm verify:phase-5
2026-05-13T13:00:40.2205062Z [36;1mpnpm verify:phase-5[0m
2026-05-13T13:00:40.2227916Z shell: /usr/bin/bash -e {0}
2026-05-13T13:00:40.2228172Z env:
2026-05-13T13:00:40.2228420Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-13T13:00:40.2228741Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-13T13:00:40.2228966Z   SKIP_TRACE_CHECK: 1
2026-05-13T13:00:40.2229170Z ##[endgroup]
2026-05-13T13:00:40.5322727Z 
2026-05-13T13:00:40.5328079Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-13T13:00:40.5333949Z > node scripts/verify-phase-5.mjs
2026-05-13T13:00:40.5334596Z 
2026-05-13T13:00:40.5614170Z 
2026-05-13T13:00:40.5615342Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-13T13:00:40.5617159Z >>> pnpm verify:phase-4
2026-05-13T13:00:40.8731801Z 
2026-05-13T13:00:40.8732620Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-13T13:00:40.8733304Z > node scripts/verify-phase-4.mjs
2026-05-13T13:00:40.8733562Z 
2026-05-13T13:00:40.8987768Z 
2026-05-13T13:00:40.8988872Z === Workspace: typecheck ===
2026-05-13T13:00:40.8990004Z >>> pnpm -r typecheck
2026-05-13T13:00:41.2165118Z Scope: 5 of 6 workspace projects
2026-05-13T13:00:41.2205807Z packages/db typecheck$ tsc --noEmit
2026-05-13T13:00:41.2214616Z packages/game-logic typecheck$ tsc --noEmit
2026-05-13T13:00:43.8754950Z packages/game-logic typecheck: Done
2026-05-13T13:00:43.8801081Z packages/protocol typecheck$ tsc --noEmit
2026-05-13T13:00:45.7939178Z packages/db typecheck: Done
2026-05-13T13:00:47.2580722Z packages/protocol typecheck: Done
2026-05-13T13:00:47.2588601Z apps/client typecheck$ tsc --noEmit
2026-05-13T13:00:47.2591350Z apps/server typecheck$ tsc --noEmit
2026-05-13T13:00:58.7667780Z apps/client typecheck: Done
2026-05-13T13:00:59.5894444Z apps/server typecheck: Done
2026-05-13T13:00:59.6005839Z 
2026-05-13T13:00:59.6006476Z === Lint: protocol-sync ===
2026-05-13T13:00:59.6007252Z >>> pnpm lint:protocol-sync
2026-05-13T13:00:59.8945433Z 
2026-05-13T13:00:59.8946476Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-13T13:00:59.8947720Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-13T13:00:59.8948341Z 
2026-05-13T13:00:59.9276373Z lint-protocol-sync: OK
2026-05-13T13:00:59.9410943Z 
2026-05-13T13:00:59.9411750Z === Lint: game-logic-purity ===
2026-05-13T13:00:59.9412903Z >>> pnpm lint:game-logic-purity
2026-05-13T13:01:00.2346205Z 
2026-05-13T13:01:00.2347555Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-13T13:01:00.2348670Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-13T13:01:00.2349249Z 
2026-05-13T13:01:00.2693188Z lint-game-logic-purity: OK (7 file(s) clean)
2026-05-13T13:01:00.2825121Z 
2026-05-13T13:01:00.2825836Z === Lint: better-auth-schema-sync ===
2026-05-13T13:01:00.2828240Z >>> pnpm lint:better-auth-schema-sync
2026-05-13T13:01:00.5801736Z 
2026-05-13T13:01:00.5803358Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-13T13:01:00.5806332Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-13T13:01:00.5806781Z 
2026-05-13T13:01:02.0386258Z lint-better-auth-schema-sync: OK
2026-05-13T13:01:02.0522934Z 
2026-05-13T13:01:02.0523833Z === Lint: rate-limit-budgets ===
2026-05-13T13:01:02.0524538Z >>> pnpm lint:rate-limit-budgets
2026-05-13T13:01:02.3436422Z 
2026-05-13T13:01:02.3437125Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-13T13:01:02.3437670Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-13T13:01:02.3437903Z 
2026-05-13T13:01:02.3768746Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-13T13:01:02.3909374Z 
2026-05-13T13:01:02.3910030Z === Lint: no-clipboard-rce ===
2026-05-13T13:01:02.3910652Z >>> pnpm lint:no-clipboard-rce
2026-05-13T13:01:02.6833237Z 
2026-05-13T13:01:02.6843817Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-13T13:01:02.6848127Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-13T13:01:02.6853155Z 
2026-05-13T13:01:02.7194461Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-13T13:01:02.7327540Z 
2026-05-13T13:01:02.7328317Z === Lint: room-layout ===
2026-05-13T13:01:02.7329027Z >>> pnpm lint:room-layout
2026-05-13T13:01:03.0250370Z 
2026-05-13T13:01:03.0251513Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-13T13:01:03.0252970Z > node tools/scripts/lint-room-layout.mjs
2026-05-13T13:01:03.0253559Z 
2026-05-13T13:01:03.0646168Z lint-room-layout: OK
2026-05-13T13:01:03.0776259Z 
2026-05-13T13:01:03.0777024Z === ADR 0004 lint ===
2026-05-13T13:01:03.0777727Z >>> pnpm lint:adr:0004
2026-05-13T13:01:03.3683837Z 
2026-05-13T13:01:03.3684527Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-13T13:01:03.3685770Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-13T13:01:03.3687054Z 
2026-05-13T13:01:03.4021737Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-13T13:01:03.4153038Z 
2026-05-13T13:01:03.4153815Z === Drizzle: emit-check ===
2026-05-13T13:01:03.4154620Z >>> pnpm db:emit-check
2026-05-13T13:01:03.7081699Z 
2026-05-13T13:01:03.7083166Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-13T13:01:03.7086039Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-13T13:01:03.7087985Z 
2026-05-13T13:01:04.1457933Z No config path provided, using default 'drizzle.config.ts'
2026-05-13T13:01:04.1459881Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-13T13:01:04.5186418Z 8 tables
2026-05-13T13:01:04.5187198Z accounts 8 columns 1 indexes 0 fks
2026-05-13T13:01:04.5188000Z audit_log 6 columns 0 indexes 2 fks
2026-05-13T13:01:04.5188744Z characters 9 columns 0 indexes 1 fks
2026-05-13T13:01:04.5189496Z inventory_items 4 columns 0 indexes 1 fks
2026-05-13T13:01:04.5190342Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-13T13:01:04.5191192Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-13T13:01:04.5191986Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-13T13:01:04.5193141Z sessions 5 columns 0 indexes 1 fks
2026-05-13T13:01:04.5193649Z 
2026-05-13T13:01:04.5194848Z No schema changes, nothing to migrate 😴
2026-05-13T13:01:04.6674940Z 
2026-05-13T13:01:04.6675831Z === Drizzle: schema-sync ===
2026-05-13T13:01:04.6676751Z >>> pnpm lint:schema-sync
2026-05-13T13:01:04.9833436Z 
2026-05-13T13:01:04.9834537Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-13T13:01:04.9837758Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-13T13:01:04.9840118Z 
2026-05-13T13:01:05.0108418Z OK
2026-05-13T13:01:05.0245990Z 
2026-05-13T13:01:05.0246765Z === Drizzle: source-comments ===
2026-05-13T13:01:05.0247521Z >>> pnpm lint:source-comments
2026-05-13T13:01:05.3221579Z 
2026-05-13T13:01:05.3222987Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-13T13:01:05.3224387Z > pnpm -C packages/db run lint:source-comments
2026-05-13T13:01:05.3224978Z 
2026-05-13T13:01:05.6447200Z 
2026-05-13T13:01:05.6448439Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-13T13:01:05.6449598Z > node scripts/check-source-comments.mjs
2026-05-13T13:01:05.6450293Z 
2026-05-13T13:01:05.6781503Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-13T13:01:05.7023446Z 
2026-05-13T13:01:05.7024319Z === Workspace: test ===
2026-05-13T13:01:05.7024918Z >>> pnpm -r test
2026-05-13T13:01:06.0046090Z Scope: 5 of 6 workspace projects
2026-05-13T13:01:06.0099618Z packages/db test$ vitest run
2026-05-13T13:01:06.0108175Z packages/game-logic test$ vitest run
2026-05-13T13:01:06.5094758Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-13T13:01:06.5096837Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-13T13:01:06.8934040Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 31[2mms[22m[39m
2026-05-13T13:01:07.1463492Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-13T13:01:07.3682158Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-13T13:01:07.4614699Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-13T13:01:07.5884425Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T13:01:07.8130434Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:01:08.0255664Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:01:08.2545422Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T13:01:08.3471092Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T13:01:08.4855444Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:01:08.5721415Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:01:08.5844353Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-13T13:01:08.5863773Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-13T13:01:08.5879751Z packages/db test: [2m   Start at [22m 13:01:06
2026-05-13T13:01:08.5881393Z packages/db test: [2m   Duration [22m 2.06s[2m (transform 178ms, setup 0ms, import 1.43s, tests 27ms, environment 0ms)[22m
2026-05-13T13:01:08.6140213Z packages/db test: Done
2026-05-13T13:01:08.6163333Z packages/protocol test$ vitest run
2026-05-13T13:01:08.7055165Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:01:08.9197352Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:01:08.9254142Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-13T13:01:08.9261923Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-13T13:01:08.9268915Z packages/game-logic test: [2m   Start at [22m 13:01:06
2026-05-13T13:01:08.9270480Z packages/game-logic test: [2m   Duration [22m 2.41s[2m (transform 196ms, setup 0ms, import 382ms, tests 101ms, environment 1ms)[22m
2026-05-13T13:01:08.9859837Z packages/game-logic test: Done
2026-05-13T13:01:09.1040070Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-13T13:01:09.3953638Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-13T13:01:09.5621354Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:01:09.7298469Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:01:09.8828506Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T13:01:09.8860406Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-13T13:01:09.8868055Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-13T13:01:09.8869568Z packages/protocol test: [2m   Start at [22m 13:01:09
2026-05-13T13:01:09.8871268Z packages/protocol test: [2m   Duration [22m 775ms[2m (transform 123ms, setup 0ms, import 227ms, tests 30ms, environment 0ms)[22m
2026-05-13T13:01:09.9215599Z packages/protocol test: Done
2026-05-13T13:01:09.9220467Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-13T13:01:09.9224582Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-13T13:01:10.4624697Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-13T13:01:10.5030366Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-13T13:01:11.4887701Z apps/server test: {"level":30,"time":1778677271482,"pid":4699,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-13T13:01:11.4934377Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 736[2mms[22m[39m
2026-05-13T13:01:11.4936083Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 586[2mms[22m[39m
2026-05-13T13:01:12.4429845Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-13T13:01:12.4464745Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-13T13:01:12.5300319Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 241[2mms[22m[39m
2026-05-13T13:01:12.6686077Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 46[2mms[22m[39m
2026-05-13T13:01:13.6075433Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-13T13:01:13.6093943Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-o92djP/rebno.db
2026-05-13T13:01:13.6095736Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T13:01:13.6109739Z apps/server test: [run-migrations] OK
2026-05-13T13:01:13.6205306Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-13T13:01:13.6226799Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-S2xDgP/rebno.db
2026-05-13T13:01:13.6229263Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T13:01:13.6233111Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-13T13:01:13.6234701Z apps/server test: [run-migrations] OK
2026-05-13T13:01:13.6294491Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-13T13:01:13.6301907Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-OvNF61/rebno.db
2026-05-13T13:01:13.6330000Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T13:01:13.6353349Z apps/server test: [run-migrations] OK
2026-05-13T13:01:13.6364383Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-13T13:01:13.6373793Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-OvNF61/rebno.db
2026-05-13T13:01:13.6393572Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T13:01:13.6413139Z apps/server test: [run-migrations] OK
2026-05-13T13:01:13.6433935Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 50[2mms[22m[39m
2026-05-13T13:01:13.7417524Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 150[2mms[22m[39m
2026-05-13T13:01:13.9310592Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 41[2mms[22m[39m
2026-05-13T13:01:14.2277255Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-13T13:01:14.4864703Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-13T13:01:14.7194641Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T13:01:14.9986346Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 111[2mms[22m[39m
2026-05-13T13:01:15.0285431Z apps/server test: {"level":40,"time":1778677275022,"pid":4818,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T13:01:15.0364593Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-13T13:01:15.0454510Z apps/server test: {"level":40,"time":1778677275029,"pid":4818,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T13:01:15.0473993Z apps/server test: {"level":40,"time":1778677275030,"pid":4818,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T13:01:15.3173621Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-13T13:01:16.1347151Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-13T13:01:16.1368429Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ◈ encrypted .env [www.dotenvx.com]
2026-05-13T13:01:16.1369928Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-13T13:01:16.2674879Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 118[2mms[22m[39m
2026-05-13T13:01:16.9139900Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T13:01:17.1347547Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:01:17.1414116Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-13T13:01:17.1415266Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-13T13:01:17.1450958Z apps/server test: [2m   Start at [22m 13:01:10
2026-05-13T13:01:17.1474213Z apps/server test: [2m   Duration [22m 6.66s[2m (transform 483ms, setup 0ms, import 3.41s, tests 951ms, environment 2ms)[22m
2026-05-13T13:01:17.1918332Z apps/server test: Done
2026-05-13T13:01:17.3455338Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 72[2mms[22m[39m
2026-05-13T13:01:18.0956375Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 77[2mms[22m[39m
2026-05-13T13:01:18.8284110Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 39[2mms[22m[39m
2026-05-13T13:01:19.5489723Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 33[2mms[22m[39m
2026-05-13T13:01:20.2479028Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-13T13:01:20.9587966Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-13T13:01:21.6740825Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-13T13:01:22.4514021Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-13T13:01:23.1429382Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:01:23.8291051Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-13T13:01:24.5150928Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T13:01:25.1866472Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:01:25.8658670Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T13:01:26.5508021Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T13:01:27.2421929Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T13:01:27.9222724Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:01:28.6126777Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:01:29.2834586Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:01:29.9587669Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T13:01:30.6636862Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T13:01:31.3626567Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-13T13:01:31.3883435Z apps/client test: [2m Test Files [22m [1m[32m25 passed[39m[22m[90m (25)[39m
2026-05-13T13:01:31.3904156Z apps/client test: [2m      Tests [22m [1m[32m188 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (192)[39m
2026-05-13T13:01:31.3913156Z apps/client test: [2m   Start at [22m 13:01:10
2026-05-13T13:01:31.3917059Z apps/client test: [2m   Duration [22m 20.88s[2m (transform 783ms, setup 60ms, collect 1.26s, tests 968ms, environment 12.24s, prepare 2.21s)[22m
2026-05-13T13:01:31.5286193Z apps/client test: Done
2026-05-13T13:01:31.5367688Z 
2026-05-13T13:01:31.5368348Z verify-phase-4: OK (12 steps green)
2026-05-13T13:01:31.5503388Z 
2026-05-13T13:01:31.5504013Z === Workspace: typecheck ===
2026-05-13T13:01:31.5504694Z >>> pnpm -r typecheck
2026-05-13T13:01:31.8505666Z Scope: 5 of 6 workspace projects
2026-05-13T13:01:31.8556818Z packages/db typecheck$ tsc --noEmit
2026-05-13T13:01:31.8565341Z packages/game-logic typecheck$ tsc --noEmit
2026-05-13T13:01:34.2693793Z packages/game-logic typecheck: Done
2026-05-13T13:01:34.2700909Z packages/protocol typecheck$ tsc --noEmit
2026-05-13T13:01:36.5093772Z packages/db typecheck: Done
2026-05-13T13:01:37.8271044Z packages/protocol typecheck: Done
2026-05-13T13:01:37.8278332Z apps/client typecheck$ tsc --noEmit
2026-05-13T13:01:37.8281402Z apps/server typecheck$ tsc --noEmit
2026-05-13T13:01:49.6524485Z apps/client typecheck: Done
2026-05-13T13:01:50.3148710Z apps/server typecheck: Done
2026-05-13T13:01:50.3257767Z 
2026-05-13T13:01:50.3258556Z === Lint: deploy-stack ===
2026-05-13T13:01:50.3259199Z >>> pnpm lint:deploy-stack
2026-05-13T13:01:50.6240531Z 
2026-05-13T13:01:50.6241701Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-13T13:01:50.6243212Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-13T13:01:50.6244359Z 
2026-05-13T13:01:50.6561658Z lint-deploy-stack: OK
2026-05-13T13:01:50.6703178Z 
2026-05-13T13:01:50.6704116Z === Lint: deploy-stack test ===
2026-05-13T13:01:50.6704972Z >>> pnpm lint:deploy-stack:test
2026-05-13T13:01:50.9661046Z 
2026-05-13T13:01:50.9662198Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-13T13:01:50.9663601Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-13T13:01:50.9664258Z 
2026-05-13T13:01:51.0353293Z PASS: lint-deploy-stack green
2026-05-13T13:01:51.0478493Z 
2026-05-13T13:01:51.0479342Z === ADR 0005 lint ===
2026-05-13T13:01:51.0480044Z >>> pnpm lint:adr:0005
2026-05-13T13:01:51.3483451Z 
2026-05-13T13:01:51.3484626Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-13T13:01:51.3486051Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-13T13:01:51.3486835Z 
2026-05-13T13:01:51.3803251Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-13T13:01:51.3938695Z 
2026-05-13T13:01:51.3939490Z === ADR 0006 lint ===
2026-05-13T13:01:51.3940156Z >>> pnpm lint:adr:0006
2026-05-13T13:01:51.6944880Z 
2026-05-13T13:01:51.6946007Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-13T13:01:51.6947411Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-13T13:01:51.6948130Z 
2026-05-13T13:01:51.7274321Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-13T13:01:51.7412881Z 
2026-05-13T13:01:51.7413830Z === Workspace: test ===
2026-05-13T13:01:51.7414338Z >>> pnpm -r test
2026-05-13T13:01:52.0454540Z Scope: 5 of 6 workspace projects
2026-05-13T13:01:52.0531611Z packages/db test$ vitest run
2026-05-13T13:01:52.0539551Z packages/game-logic test$ vitest run
2026-05-13T13:01:52.5799263Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-13T13:01:52.5808178Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-13T13:01:52.9805033Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-13T13:01:53.2029542Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-13T13:01:53.4210263Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-13T13:01:53.5229972Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-13T13:01:53.6534756Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-13T13:01:53.8708383Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:01:54.0743704Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:01:54.2976152Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T13:01:54.3619259Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T13:01:54.5248668Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:01:54.6125396Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T13:01:54.6143693Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-13T13:01:54.6300974Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-13T13:01:54.6304762Z packages/db test: [2m   Start at [22m 13:01:52
2026-05-13T13:01:54.6306009Z packages/db test: [2m   Duration [22m 2.03s[2m (transform 176ms, setup 0ms, import 1.42s, tests 28ms, environment 0ms)[22m
2026-05-13T13:01:54.6306858Z packages/db test: Done
2026-05-13T13:01:54.6307261Z packages/protocol test$ vitest run
2026-05-13T13:01:54.7947348Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T13:01:55.0134479Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:01:55.0141614Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-13T13:01:55.0166458Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-13T13:01:55.0167891Z packages/game-logic test: [2m   Start at [22m 13:01:52
2026-05-13T13:01:55.0169936Z packages/game-logic test: [2m   Duration [22m 2.44s[2m (transform 222ms, setup 0ms, import 404ms, tests 84ms, environment 2ms)[22m
2026-05-13T13:01:55.0444467Z packages/game-logic test: Done
2026-05-13T13:01:55.1004732Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-13T13:01:55.3954630Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-13T13:01:55.5593298Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:01:55.7274673Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:01:55.8767964Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T13:01:55.8804425Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-13T13:01:55.8829144Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-13T13:01:55.8830231Z packages/protocol test: [2m   Start at [22m 13:01:55
2026-05-13T13:01:55.8844487Z packages/protocol test: [2m   Duration [22m 773ms[2m (transform 119ms, setup 0ms, import 228ms, tests 30ms, environment 0ms)[22m
2026-05-13T13:01:55.9148349Z packages/protocol test: Done
2026-05-13T13:01:55.9153088Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-13T13:01:55.9155636Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-13T13:01:56.4560962Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-13T13:01:56.5076723Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-13T13:01:57.4724681Z apps/server test: {"level":30,"time":1778677317465,"pid":5785,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-13T13:01:57.4759474Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 727[2mms[22m[39m
2026-05-13T13:01:57.4814217Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 608[2mms[22m[39m
2026-05-13T13:01:58.4125311Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-13T13:01:58.4158974Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-13T13:01:58.4899919Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 235[2mms[22m[39m
2026-05-13T13:01:58.5605037Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-13T13:01:58.5644014Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-eCZrGc/rebno.db
2026-05-13T13:01:58.5664043Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T13:01:58.5685396Z apps/server test: [run-migrations] OK
2026-05-13T13:01:58.5791195Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-13T13:01:58.5808451Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-I2hF4A/rebno.db
2026-05-13T13:01:58.5811050Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T13:01:58.5815994Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-13T13:01:58.5832751Z apps/server test: [run-migrations] OK
2026-05-13T13:01:58.5908752Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-13T13:01:58.5973942Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-c5Ded9/rebno.db
2026-05-13T13:01:58.5976753Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T13:01:58.5978737Z apps/server test: [run-migrations] OK
2026-05-13T13:01:58.5982313Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-13T13:01:58.5985972Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-c5Ded9/rebno.db
2026-05-13T13:01:58.5987499Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T13:01:58.5988563Z apps/server test: [run-migrations] OK
2026-05-13T13:01:58.6065249Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 64[2mms[22m[39m
2026-05-13T13:01:59.6244821Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 45[2mms[22m[39m
2026-05-13T13:01:59.7360851Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 145[2mms[22m[39m
2026-05-13T13:01:59.8772692Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-13T13:02:00.2020435Z apps/server test: {"level":40,"time":1778677320199,"pid":5870,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T13:02:00.2088464Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-13T13:02:00.2114144Z apps/server test: {"level":40,"time":1778677320202,"pid":5870,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T13:02:00.2133725Z apps/server test: {"level":40,"time":1778677320203,"pid":5870,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T13:02:00.4519994Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-13T13:02:00.7374853Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-13T13:02:00.9281203Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 114[2mms[22m[39m
2026-05-13T13:02:01.0154473Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-13T13:02:01.2389182Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T13:02:02.0377182Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-13T13:02:02.0414392Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ custom filepath { path: '/custom/path/.env' }
2026-05-13T13:02:02.0433680Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-13T13:02:02.1778635Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 131[2mms[22m[39m
2026-05-13T13:02:02.7619935Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:02:03.0020601Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-13T13:02:03.0104052Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-13T13:02:03.0143607Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-13T13:02:03.0153384Z apps/server test: [2m   Start at [22m 13:01:56
2026-05-13T13:02:03.0183885Z apps/server test: [2m   Duration [22m 6.53s[2m (transform 458ms, setup 0ms, import 3.28s, tests 959ms, environment 2ms)[22m
2026-05-13T13:02:03.0511560Z apps/server test: Done
2026-05-13T13:02:03.2355101Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 69[2mms[22m[39m
2026-05-13T13:02:03.9894757Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 73[2mms[22m[39m
2026-05-13T13:02:04.7002944Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 39[2mms[22m[39m
2026-05-13T13:02:05.4089417Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 32[2mms[22m[39m
2026-05-13T13:02:06.1010164Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-13T13:02:06.8090956Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-13T13:02:07.5741040Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-13T13:02:08.2865932Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-13T13:02:08.9740703Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-13T13:02:09.6593234Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:02:10.3463431Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:02:11.0233564Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T13:02:11.7180974Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T13:02:12.4288598Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T13:02:13.0887074Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:02:13.7666210Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:02:14.4425543Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T13:02:15.1061247Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T13:02:15.7639135Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T13:02:16.4475211Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T13:02:17.1381741Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-13T13:02:17.1634203Z apps/client test: [2m Test Files [22m [1m[32m25 passed[39m[22m[90m (25)[39m
2026-05-13T13:02:17.1635738Z apps/client test: [2m      Tests [22m [1m[32m188 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (192)[39m
2026-05-13T13:02:17.1646312Z apps/client test: [2m   Start at [22m 13:01:56
2026-05-13T13:02:17.1648079Z apps/client test: [2m   Duration [22m 20.65s[2m (transform 787ms, setup 59ms, collect 1.25s, tests 969ms, environment 12.07s, prepare 2.22s)[22m
2026-05-13T13:02:17.3048356Z apps/client test: Done
2026-05-13T13:02:17.3140304Z 
2026-05-13T13:02:17.3141160Z verify-phase-5: OK (7 steps green)
